/*
 * Projekt do předmetu GJA - LATEX TABLE CREATOR
 *
 * Soubor: LatexTableCreatorView.java
 *
 * Ondřej Klubal <xkluba00@stud.fit.vutbr.cz>
 * Petr Šimon    <xsimon10@stud.fit.vutbr.cz>
 */

package latextablecreator;

import org.jdesktop.application.Action;
import org.jdesktop.application.ResourceMap;
import org.jdesktop.application.SingleFrameApplication;
import org.jdesktop.application.FrameView;
import org.jdesktop.application.TaskMonitor;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import border.*;
import javax.swing.border.*;
import table.*;
import java.util.Vector;
import ArrowButton.ArrowButton;
import javax.swing.event.*;
import java.io.*;
import ImportExport.ImportExport;
import ImportExport.ExampleFileFilter;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileFilter;

////////////////////////////////////////////////////////////////////////////////
// Pomocné třídy

/**
 * Popisuje cell renderer <code>TableCellRenderer</code> pro buňky hlavičky tabulky <code>JTable</code>.
 * Jedná se o přestylovaný label <code>JLabel</code>.
 * "šedé raised tlačítko"
 */
class HeaderRenderer extends JLabel implements TableCellRenderer
{

     JTable mainTable;
     boolean rowHeader;
     //jedná se o rowHeader
     
     /**
     * Konstruktor
     * @param table         Hlavní tabulka
     * @param rowHeader     Určuje, zda se ledná o rowHeader (true) či standartní columnHeader (false)
     */
     HeaderRenderer(JTable table, boolean rowHeader)
     {
          mainTable = table; //zapamatujeme si hlavní tabulku
          JTableHeader header = table.getTableHeader();
          setOpaque(true);
          setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
          setHorizontalAlignment(CENTER);
          setForeground(header.getForeground());
          setBackground(header.getBackground());
          setFont(header.getFont());
          this.rowHeader = rowHeader;
     }
     
     /**
      * Vrací konponentu pro vykreslení buňky
      * @param  table          vykreslovaná tabulka
      * @param  value          objekt vykreslované buňky
      * @param  isSelected     buňka je vybraná
      * @param  hasFocus  má fokus (nevyužito)
      * @param  row          index řádku
      * @param  column            index sloupce
      */
     public Component  getTableCellRendererComponent(JTable table, Object value,
               boolean isSelected, boolean hasFocus,
               int row, int column)
     {
     
          JTableHeader header = table.getTableHeader();
          
          //výchozí nastavení
          setForeground(header.getForeground());
          setBackground(header.getBackground());
          setBorder(BorderFactory.createEtchedBorder(EtchedBorder.RAISED));
          
          //přístup k modelu
          TableModel model = mainTable.getModel();
          
          //model může obsahovat paramety - nařteme je
          if (model instanceof AttributiveCellTableModel)
          {
          
               DefaultCellAttribute cell = (DefaultCellAttribute)((AttributiveCellTableModel)model).getCellAttribute();
               
               //zvýrazňování při zadané velikosti řádku/sloupce
               if (rowHeader)
               {
                    if (cell.getHeightType(row) != DefaultCellAttribute.SIZE_NONE) setFont(header.getFont().deriveFont(Font.BOLD + Font.ITALIC));
                    else  setFont(header.getFont());
                    
               }
               else
               {
                    if (cell.getWidthType(column) != DefaultCellAttribute.SIZE_NONE) setFont(header.getFont().deriveFont(Font.BOLD + Font.ITALIC));
                    else  setFont(header.getFont());
               }
               
          }
          
          if (isSelected && rowHeader) //rowHeader
          {
               // pokud jsou ve hlavní tabulce vybrány úplně všechny sloupce
               if (mainTable.getColumnCount() == mainTable.getSelectedColumnCount())
               {
                    setForeground(Color.WHITE);
                    setBackground(Color.BLACK);
                    setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
               }
               else
               {
                    setForeground(Color.BLACK);
                    setBackground(new Color(215, 220, 206));
                    setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 2, Color.LIGHT_GRAY), BorderFactory.createEmptyBorder(2, 3, 1, 3)));
               }
          }
          else if (!rowHeader) //columnHeader (nefunguje parametr selected - výběr musíme zjistit sami)
          {
               int[] columns = mainTable.getSelectedColumns();
               int columnsCount = columns.length;
               
               for (int i = 0; i < columnsCount; i++) //najdeme aktuální sloupec
                    if (columns[i] == column) //aktuální sloupec je vybraný
                    {
                         if (mainTable.getRowCount() == mainTable.getSelectedRowCount())
                         {
                              setForeground(Color.WHITE);
                              setBackground(Color.BLACK);
                              setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
                         }
                         else
                         {
                              setForeground(Color.BLACK);
                              setBackground(new Color(215, 220, 206));
                              setBorder(BorderFactory.createCompoundBorder(BorderFactory.createMatteBorder(0, 0, 1, 2, Color.LIGHT_GRAY), BorderFactory.createEmptyBorder(2, 3, 1, 3)));
                         }
                    }
          }
          
          
          //nastavíme text
          setText((value == null) ? "" : value.toString());
          return this;
     }
}



/**
 * Jednoduchá dynamicky generovaná ikona <code>Icon</code> dle definované barvy s černým rámečkem (16x16px)
 * "Ikona vybarvení buňky"
 */
class ColorBoxIcon implements Icon
{
     Color fillColor = Color.YELLOW; //výchozí barva
     
     /**
     * Konstruktor
     * @param color     Barva výplně.
     */
     ColorBoxIcon(Color color)
     {
          fillColor = color;
     }
     
     /**
      * Vrátí šířku ikony (natvrdo 16px)
      */
     public int getIconWidth() { return 16; }
     /**
      * Vrátí výšku ikony (natvrdo 16px)
      */
     public int getIconHeight() { return 16; }
     /**
      * Vrátí aktuální nastavenou barvu výplně (může sloužit pro uchování barvy)
      */
     public Color getColor()
     {
          return fillColor;
     }
     
     /**
      * Vykreslí ikonu. Kreslení je řešeno dynamicky.
      * @param c     Konponenta (nevyužito).
      * @param g     Odkaz na <code>Graphics</code>. Vykreslování.
      * @param x     X souřadnice levého horního rohu.
      * @param y     Y souřadnice levého horního rohu.
      */
     public void paintIcon(Component c, Graphics g, int x, int y)
     {
          Color oldColor = g.getColor();
          
          //vyplníme vybranou barvou
          g.setColor(fillColor);
          g.fillRect(x + 1, y + 1, 16 - 4, 16 - 4);
          
          //nakreslíme černý rámeček
          g.setColor(Color.BLACK);
          g.drawLine(x + 01, y + 01, x + 01, y + 13);
          g.drawLine(x + 01, y + 01, x + 13, y + 01);
          g.drawLine(x + 13, y + 01, x + 13, y + 13);
          g.drawLine(x + 01, y + 13, x + 13, y + 13);
          g.setColor(oldColor);
     }
}

////////////////////////////////////////////////////////////////////////////////


/**
 * Hlavní okno aplikace.
 */
public class LatexTableCreatorView extends FrameView
{
     //Nazev souboru, se kterym budeme pracovat
     String filename;
     //filtr (pripona) aktualniho souboru
     FileFilter fileFilter;

     ExampleFileFilter csvFilter = new ExampleFileFilter("csv", "Hodnoty oddělené čárkami");
     ExampleFileFilter csvFilterStrednik = new ExampleFileFilter("csv", "Hodnoty oddělené středníkem");
     ExampleFileFilter texFilter = new ExampleFileFilter("tex", "Dokument LaTeX");

     /**
      * Konstruktor
      */
     public LatexTableCreatorView(SingleFrameApplication app)
     {
          super(app);
          
          initComponents(); //inicializace konponent
          
          //nastaví ikonu okna
          java.net.URL url = ClassLoader.getSystemResource("latextablecreator/resources/LTLogoICO.png");
          Toolkit kit = Toolkit.getDefaultToolkit();
          Image img = kit.createImage(url);
          getFrame().setIconImage(img);
          
          
          
          //vytvoříme Model Tabulky (1x1)
          model = new AttributiveCellTableModel(
               new Object [][]
               {
                    {""}
               },
               new String []
               {
                    "A"
               }
          );
          
          //----------------------------------------------------------------------
          //umožníme si přístup k atributům tabulky
          cellAtt = (CellSpan)model.getCellAttribute();
          
          //vytvořím tabulku v ScroolPanelu s daným modelem.
          jTable1 = new table.MultiSpanCellTable(model);
          jTable1.setName("jTable1"); // NOI18N
          jScrollPane1.setViewportView(jTable1);
          
          
          //povolení výběru buněk v tabulce
          jTable1.setRowSelectionAllowed(true);
          jTable1.setColumnSelectionAllowed(true);
          jTable1.setCellSelectionEnabled(true);
          //povolení násobného výběru buňek (ale v jednom bloku !!)
          jTable1.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
          
          //nastavíme mezery mezi buňkami na 0
          jTable1.setIntercellSpacing(new Dimension(0, 0));
          //povolení nastavování rámečku
          jTable1.setDefaultRenderer(Object.class, new AttributiveCellRenderer());
          
          //zrušíme automatický align
          jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
          
          //předefinujeme vykreslování horizontálního Headeru
          jTable1.getTableHeader().setDefaultRenderer(new HeaderRenderer(jTable1, false));
          
          //nastavíme písmo
          jTable1.setFont(new Font("serif", Font.PLAIN, 12));
          //výchozí velikost řádku
          jTable1.setRowHeight(20);
          
          jTable1.getTableHeader().setUI(new ColumnHeaderTableUI());
          
          //----------------------------------------------------------------------
          //vytvoříme postraní Header
          rowHeaderModel  = new DefaultTableModel();
          rowHeaderModel.addColumn(""); //vždy bude mít jeden sloupec
          rowHeaderModel.addRow(new Object[] {"1"}); //a na začátku jeden řádek
          rowHeader = new JTable(rowHeaderModel)
          {
               @Override  //zakážeme editaci buněk
               public boolean isCellEditable(int rowIndex, int vColIndex)
               {
                    return false;
               }
          };
          
          //obsluha výběru buněk -> korekce při sloučení !!
          MSCTSelectionListener listener = new MSCTSelectionListener(jTable1, rowHeader);
          jTable1.getColumnModel().getSelectionModel().addListSelectionListener(listener); //bude reagovat při změně řádků
          jTable1.getSelectionModel().addListSelectionListener(listener); //i sloupců
          
          //nastavíme stavy tlačítek dle aktuálního výběru buňek
          table_listener = (new ListSelectionListener() // ještě jeden individuální table listener
          {
               public void valueChanged(ListSelectionEvent e) //při změně výběru
               {
                    CellFont cellFont = (CellFont) model.getCellAttribute();
                    
                    //nic není vybráno -> exit
                    if (jTable1.getSelectedRowCount() < 1) return;
                    
                    if (jTable1.getSelectedColumnCount() < 1) return;
                    
                    //nelze vzít aktuální vybraný, ale minimální kvůli možné záměně pořadí výběru !!!!!
                    int colMin = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
                    int rowMin = jTable1.getSelectionModel().getMinSelectionIndex();
                    
                    //italika
                    if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_I) == CellFont.FLAG_I)
                         btItalic.setSelected(true);
                    else
                         btItalic.setSelected(false);
                         
                    //tučné
                    if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_B) == CellFont.FLAG_B)
                         btBold.setSelected(true);
                    else
                         btBold.setSelected(false);
                         
                    //TT
                    if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_T) == CellFont.FLAG_T)
                         btTypeWriter.setSelected(true);
                    else
                         btTypeWriter.setSelected(false);
                         
                         
                    //horizontální zarovnání
                    btHorizontalLeft.setSelected(false);
                    btHorizontalCenter.setSelected(false);
                    btHorizontalRight.setSelected(false);
                    
                    if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_H_A1) == CellFont.FLAG_H_A1)
                    {
                         if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_H_A2) == CellFont.FLAG_H_A2)
                              btHorizontalRight.setSelected(true);
                         else
                              btHorizontalCenter.setSelected(true);
                    }
                    else
                         btHorizontalLeft.setSelected(true);
                         
                    //detekce sloučení buňek
                    if (cellAtt.isCombined(rowMin, colMin))
                         btSluc.setSelected(true);
                    else
                         btSluc.setSelected(false);
                         
                    jTable1.repaint(); //překreslení tabulky
                    
               }
          });
          
          //nastavíme tohoto pozorovatele pro reakci na změnu řádků i sloupců
          jTable1.getColumnModel().getSelectionModel().addListSelectionListener(table_listener);
          jTable1.getSelectionModel().addListSelectionListener(table_listener);
          
          //předefinujeme UI rowheaderu
          rowHeader.setUI(new RowHeaderTableUI());
          ((RowHeaderTableUI) rowHeader.getUI()).setMainTable(jTable1); //potřebuje odkaz na hlavní tabulku
          
          //nastavíme mezery mezi buňkami na 0
          rowHeader.setIntercellSpacing(new Dimension(0, 0));
          
          //nastavíme šířku headeru
          Dimension d = rowHeader.getPreferredScrollableViewportSize();
          d.width = rowHeader.getPreferredSize().width;
          rowHeader.setPreferredScrollableViewportSize(d);
          rowHeader.setRowSelectionAllowed(true); //povolení výběru
          
          //nastavíme výšku buněk v headeru
          rowHeader.setRowHeight(jTable1.getRowHeight());
          //vykreslovač
          rowHeader.setDefaultRenderer(Object.class, new HeaderRenderer(jTable1, true));
          
          //pololíme zobrazení headru
          jScrollPane1.setRowHeaderView(rowHeader);
          //----------------------------------------------------------------------
          //horní levý roh tabulky
          JTableHeader corner = rowHeader.getTableHeader();
          corner.setReorderingAllowed(false); //zakázání přesunu
          corner.setResizingAllowed(false);    //zakázání rozšiřování
          corner.addMouseListener(new MouseAdapter()
          {
               /**
                * označí celou HLAVNÍ tabulku
                */
               @Override
               public void mouseClicked(MouseEvent e)
               {
                    jTable1.clearSelection();
                    jTable1.selectAll();
                    jTable1.repaint();
               }
          });
          corner.setDefaultRenderer(new HeaderRenderer(rowHeader, false)); //nastavení vzhled
          jScrollPane1.setCorner(JScrollPane.UPPER_LEFT_CORNER, corner);
          //----------------------------------------------------------------------
          
          //nastavíme velikosti tabulky
          jSpinner1.setValue(jTable1.getColumnCount());
          jSpinner2.setValue(jTable1.getRowCount());
          //----------------------------------------------------------------------
          //----------------------------------------------------------------------
          //Definujeme rámečkovací tlačítko
          // naše specialita - dvojtlačítko s šipkou
          btBorder = new ArrowButton(new ColorBoxIcon(Color.YELLOW))
          {
               //přiřadíme události
               
               /**
                * Klik na tlačítko -> nastaví aktuální rámeček
                */
               @Override
               public void doAction()
               {
                    pmiActualBorder.doClick();
               }
               
               /**
                * Klik na šipku -> vyvolá menu pro výměr rámečku na pozici pod plačítkem
                */
               @Override
               public void doMenu()
               {
                    pmBorder.show(btBorder, btBorder.getHorizontalTextPosition(), btBorder.getY() + btBorder.getHeight() - 4);
               }
          };
          
          //nastavíme atributy našeho přidaného tlačítka
          btBorder.setToolTipText("Ohraničení");
          btBorder.setIcon(pmiNone.getIcon());
          pmiActualBorder = pmiNone; //výchozí orámování -> žádné
          jToolBar1.add(btBorder); //přidáme na konec toolbaru
          jToolBar1.addSeparator();
          //----------------------------------------------------------------------
          //Definujeme vyplňovací tlačítko
          ArrowButton btColor = new ArrowButton(new ColorBoxIcon(Color.YELLOW))
          {
               //přiřadíme události
               
               /**
                * Klik na tlačítko -> nastaví aktuální barvu (uloženou v ikoně !!!!)
                */
               @Override
               public void doAction()
               {
                    int[] cols = jTable1.getSelectedColumns();
                    int[] rows    = jTable1.getSelectedRows();
                    
                    Color newColor = ((ColorBoxIcon) this.getIcon()).getColor();
                    
                    if (newColor != null)
                         for (int i = 0; i < rows.length; i++)
                              for (int j = 0; j < cols.length; j++)
                                   ((ColoredCell) LatexTableCreatorView.this.model.getCellAttribute()).setBackground(newColor, rows[i], cols[j]);
                                   
                    jTable1.repaint();
               }
               
               /**
                * Klik na šipku -> vyvolá dialog pro výběr barvy a pak ji nastaví
                */
               @Override
               public void doMenu()
               {
               
                    int[] cols = jTable1.getSelectedColumns();
                    int[] rows    = jTable1.getSelectedRows();
                    
                    Color oldColor = Color.YELLOW;
                    
                    int row = jTable1.getSelectionModel().getMinSelectionIndex();
                    int col = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
                    
                    if ((cols.length > 0) && (rows.length > 0)) { oldColor = ((ColoredCell) LatexTableCreatorView.this.model.getCellAttribute()).getBackground(row, col);}
                    
                    Color newColor = JColorChooser.showDialog(
                                          (Component) LatexTableCreatorView.this.getComponent(),
                                          "Vyberte barvu pozadí buňky:",
                                          oldColor
                                     );
                                     
                    //nastavíme barvu pozadí
                    this.setIcon(new ColorBoxIcon(newColor));
                    
                    if (newColor != null)
                         for (int i = 0; i < rows.length; i++)
                              for (int j = 0; j < cols.length; j++)
                                   ((ColoredCell) LatexTableCreatorView.this.model.getCellAttribute()).setBackground(newColor, rows[i], cols[j]);
                                   
                    jTable1.repaint();
                    
               }
          };
          btColor.setToolTipText("Barva výplně"); //nastavíme atributy
          
          jToolBar1.add(btColor); //přidáme na lištu
          //----------------------------------------------------------------------
          
          //----------------------------------------------------------------------
          
          // status bar initialization - message timeout, idle icon and busy animation, etc
          ResourceMap resourceMap = getResourceMap();
          int messageTimeout = resourceMap.getInteger("StatusBar.messageTimeout");
          messageTimer = new Timer(messageTimeout, new ActionListener()
          {
               public void actionPerformed(ActionEvent e)
               {
                    statusMessageLabel.setText("");
               }
          });
          messageTimer.setRepeats(false);
          int busyAnimationRate = resourceMap.getInteger("StatusBar.busyAnimationRate");
          
          for (int i = 0; i < busyIcons.length; i++)
          {
               busyIcons[i] = resourceMap.getIcon("StatusBar.busyIcons[" + i + "]");
          }
          
          busyIconTimer = new Timer(busyAnimationRate, new ActionListener()
          {
               public void actionPerformed(ActionEvent e)
               {
                    busyIconIndex = (busyIconIndex + 1) % busyIcons.length;
                    statusAnimationLabel.setIcon(busyIcons[busyIconIndex]);
               }
          });
          idleIcon = resourceMap.getIcon("StatusBar.idleIcon");
          statusAnimationLabel.setIcon(idleIcon);
          progressBar.setVisible(false);
          
          // connecting action tasks to status bar via TaskMonitor
          TaskMonitor taskMonitor = new TaskMonitor(getApplication().getContext());
          taskMonitor.addPropertyChangeListener(new java.beans.PropertyChangeListener()
          {
               public void propertyChange(java.beans.PropertyChangeEvent evt)
               {
                    String propertyName = evt.getPropertyName();
                    
                    if ("started".equals(propertyName))
                    {
                         if (!busyIconTimer.isRunning())
                         {
                              statusAnimationLabel.setIcon(busyIcons[0]);
                              busyIconIndex = 0;
                              busyIconTimer.start();
                         }
                         
                         progressBar.setVisible(true);
                         progressBar.setIndeterminate(true);
                    }
                    else if ("done".equals(propertyName))
                    {
                         busyIconTimer.stop();
                         statusAnimationLabel.setIcon(idleIcon);
                         progressBar.setVisible(false);
                         progressBar.setValue(0);
                    }
                    else if ("message".equals(propertyName))
                    {
                         String text = (String)(evt.getNewValue());
                         statusMessageLabel.setText((text == null) ? "" : text);
                         messageTimer.restart();
                    }
                    else if ("progress".equals(propertyName))
                    {
                         int value = (Integer)(evt.getNewValue());
                         progressBar.setVisible(true);
                         progressBar.setIndeterminate(false);
                         progressBar.setValue(value);
                    }
               }
          });
     }
     
     
     /**
     * Zobrazí dialog o aplikaci
     */
     @Action
     public void showAboutBox()
     {
          if (aboutBox == null)
          {
               JFrame mainFrame = LatexTableCreatorApp.getApplication().getMainFrame();
               aboutBox = new LatexTableCreatorAboutBox(mainFrame);
               aboutBox.setLocationRelativeTo(mainFrame);
          }
          
          LatexTableCreatorApp.getApplication().show(aboutBox);
     }
     
     /**
      * Inicializace komponent - voláno z konstruktoru.
      * WARNING: Do NOT modify this code. The content of this method is
      * always regenerated by the Form Editor.
      */
     @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        mainPanel = new javax.swing.JPanel();
        jToolBar1 = new javax.swing.JToolBar();
        btNewFile = new javax.swing.JButton();
        btOpenFile = new javax.swing.JButton();
        btSaveFile = new javax.swing.JButton();
        jSeparator4 = new javax.swing.JToolBar.Separator();
        btCopy = new javax.swing.JButton();
        btCut = new javax.swing.JButton();
        btPaste = new javax.swing.JButton();
        btPaste1 = new javax.swing.JButton();
        jSeparator7 = new javax.swing.JToolBar.Separator();
        jLabel1 = new javax.swing.JLabel();
        jSpinner1 = new javax.swing.JSpinner();
        jLabel2 = new javax.swing.JLabel();
        jSpinner2 = new javax.swing.JSpinner();
        jSeparator1 = new javax.swing.JToolBar.Separator();
        btBold = new javax.swing.JButton();
        btItalic = new javax.swing.JButton();
        btTypeWriter = new javax.swing.JButton();
        jSeparator3 = new javax.swing.JToolBar.Separator();
        btHorizontalLeft = new javax.swing.JButton();
        btHorizontalCenter = new javax.swing.JButton();
        btHorizontalRight = new javax.swing.JButton();
        btSluc = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        btWidth = new javax.swing.JButton();
        btHeight = new javax.swing.JButton();
        jSeparator2 = new javax.swing.JToolBar.Separator();
        spBorder = new javax.swing.JSpinner();
        jLabel4 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        menuBar = new javax.swing.JMenuBar();
        javax.swing.JMenu fileMenu = new javax.swing.JMenu();
        miNew = new javax.swing.JMenuItem();
        miOpenFile = new javax.swing.JMenuItem();
        miSaveFile = new javax.swing.JMenuItem();
        miSaveFileAs = new javax.swing.JMenuItem();
        jSeparator10 = new javax.swing.JPopupMenu.Separator();
        miSaveFileAs1 = new javax.swing.JMenuItem();
        jSeparator5 = new javax.swing.JPopupMenu.Separator();
        javax.swing.JMenuItem exitMenuItem = new javax.swing.JMenuItem();
        mEdit = new javax.swing.JMenu();
        miCopy = new javax.swing.JMenuItem();
        miCut = new javax.swing.JMenuItem();
        miPaste = new javax.swing.JMenuItem();
        jSeparator6 = new javax.swing.JPopupMenu.Separator();
        miDel = new javax.swing.JMenuItem();
        mFormat = new javax.swing.JMenu();
        miBold = new javax.swing.JMenuItem();
        miItalic = new javax.swing.JMenuItem();
        jMenuItem1 = new javax.swing.JMenuItem();
        jSeparator8 = new javax.swing.JPopupMenu.Separator();
        miHL = new javax.swing.JMenuItem();
        miHC = new javax.swing.JMenuItem();
        miHR = new javax.swing.JMenuItem();
        jSeparator9 = new javax.swing.JPopupMenu.Separator();
        miSluc = new javax.swing.JMenuItem();
        javax.swing.JMenu helpMenu = new javax.swing.JMenu();
        javax.swing.JMenuItem aboutMenuItem = new javax.swing.JMenuItem();
        statusPanel = new javax.swing.JPanel();
        javax.swing.JSeparator statusPanelSeparator = new javax.swing.JSeparator();
        statusMessageLabel = new javax.swing.JLabel();
        statusAnimationLabel = new javax.swing.JLabel();
        progressBar = new javax.swing.JProgressBar();
        pmBorder = new javax.swing.JPopupMenu();
        pmiNone = new javax.swing.JMenuItem();
        pmiFull = new javax.swing.JMenuItem();
        pmiFrame = new javax.swing.JMenuItem();
        pmiLeft = new javax.swing.JMenuItem();
        pmiTop = new javax.swing.JMenuItem();
        pmiRight = new javax.swing.JMenuItem();
        pmiBottom = new javax.swing.JMenuItem();
        pmiDLeft = new javax.swing.JMenuItem();
        pmiDTop = new javax.swing.JMenuItem();
        pmiDRight = new javax.swing.JMenuItem();
        pmiDBottom = new javax.swing.JMenuItem();

        mainPanel.setName("mainPanel"); // NOI18N

        jToolBar1.setFloatable(false);
        jToolBar1.setName("jToolBar1"); // NOI18N
        jToolBar1.setPreferredSize(new java.awt.Dimension(180, 24));

        org.jdesktop.application.ResourceMap resourceMap = org.jdesktop.application.Application.getInstance(latextablecreator.LatexTableCreatorApp.class).getContext().getResourceMap(LatexTableCreatorView.class);
        btNewFile.setBackground(resourceMap.getColor("btNewFile.background")); // NOI18N
        btNewFile.setIcon(resourceMap.getIcon("btNewFile.icon")); // NOI18N
        btNewFile.setToolTipText(resourceMap.getString("btNewFile.toolTipText")); // NOI18N
        btNewFile.setBorderPainted(false);
        btNewFile.setFocusable(false);
        btNewFile.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btNewFile.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btNewFile.setName("btNewFile"); // NOI18N
        btNewFile.setOpaque(false);
        btNewFile.setPreferredSize(new java.awt.Dimension(24, 24));
        btNewFile.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btNewFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btNewFileActionPerformed(evt);
            }
        });
        jToolBar1.add(btNewFile);

        btOpenFile.setBackground(resourceMap.getColor("btOpenFile.background")); // NOI18N
        btOpenFile.setIcon(resourceMap.getIcon("btOpenFile.icon")); // NOI18N
        btOpenFile.setToolTipText(resourceMap.getString("btOpenFile.toolTipText")); // NOI18N
        btOpenFile.setBorderPainted(false);
        btOpenFile.setFocusable(false);
        btOpenFile.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btOpenFile.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btOpenFile.setName("btOpenFile"); // NOI18N
        btOpenFile.setOpaque(false);
        btOpenFile.setPreferredSize(new java.awt.Dimension(24, 24));
        btOpenFile.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btOpenFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btOpenFileActionPerformed(evt);
            }
        });
        jToolBar1.add(btOpenFile);

        btSaveFile.setBackground(resourceMap.getColor("btSaveFile.background")); // NOI18N
        btSaveFile.setIcon(resourceMap.getIcon("btSaveFile.icon")); // NOI18N
        btSaveFile.setToolTipText(resourceMap.getString("btSaveFile.toolTipText")); // NOI18N
        btSaveFile.setBorderPainted(false);
        btSaveFile.setFocusable(false);
        btSaveFile.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btSaveFile.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btSaveFile.setName("btSaveFile"); // NOI18N
        btSaveFile.setOpaque(false);
        btSaveFile.setPreferredSize(new java.awt.Dimension(24, 24));
        btSaveFile.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btSaveFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSaveFileActionPerformed(evt);
            }
        });
        jToolBar1.add(btSaveFile);

        jSeparator4.setName("jSeparator4"); // NOI18N
        jToolBar1.add(jSeparator4);

        btCopy.setBackground(resourceMap.getColor("btCopy.background")); // NOI18N
        btCopy.setIcon(resourceMap.getIcon("btCopy.icon")); // NOI18N
        btCopy.setToolTipText(resourceMap.getString("btCopy.toolTipText")); // NOI18N
        btCopy.setBorderPainted(false);
        btCopy.setFocusable(false);
        btCopy.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btCopy.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btCopy.setName("btCopy"); // NOI18N
        btCopy.setOpaque(false);
        btCopy.setPreferredSize(new java.awt.Dimension(24, 24));
        btCopy.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btCopy.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btCopyActionPerformed(evt);
            }
        });
        jToolBar1.add(btCopy);

        btCut.setBackground(resourceMap.getColor("btCut.background")); // NOI18N
        btCut.setIcon(resourceMap.getIcon("btCut.icon")); // NOI18N
        btCut.setToolTipText(resourceMap.getString("btCut.toolTipText")); // NOI18N
        btCut.setBorderPainted(false);
        btCut.setFocusable(false);
        btCut.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btCut.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btCut.setName("btCut"); // NOI18N
        btCut.setOpaque(false);
        btCut.setPreferredSize(new java.awt.Dimension(24, 24));
        btCut.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btCut.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btCutActionPerformed(evt);
            }
        });
        jToolBar1.add(btCut);

        btPaste.setBackground(resourceMap.getColor("btPaste.background")); // NOI18N
        btPaste.setIcon(resourceMap.getIcon("btPaste.icon")); // NOI18N
        btPaste.setToolTipText(resourceMap.getString("btPaste.toolTipText")); // NOI18N
        btPaste.setBorderPainted(false);
        btPaste.setFocusable(false);
        btPaste.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btPaste.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btPaste.setName("btPaste"); // NOI18N
        btPaste.setOpaque(false);
        btPaste.setPreferredSize(new java.awt.Dimension(24, 24));
        btPaste.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btPaste.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPasteActionPerformed(evt);
            }
        });
        jToolBar1.add(btPaste);
        btPaste.getAccessibleContext().setAccessibleDescription(resourceMap.getString("btPaste.AccessibleContext.accessibleDescription")); // NOI18N

        btPaste1.setBackground(resourceMap.getColor("btPaste1.background")); // NOI18N
        btPaste1.setIcon(resourceMap.getIcon("btPaste1.icon")); // NOI18N
        btPaste1.setToolTipText(resourceMap.getString("btPaste1.toolTipText")); // NOI18N
        btPaste1.setBorderPainted(false);
        btPaste1.setFocusable(false);
        btPaste1.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btPaste1.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btPaste1.setName("btPaste1"); // NOI18N
        btPaste1.setOpaque(false);
        btPaste1.setPreferredSize(new java.awt.Dimension(24, 24));
        btPaste1.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btPaste1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btPaste1ActionPerformed(evt);
            }
        });
        jToolBar1.add(btPaste1);

        jSeparator7.setName("jSeparator7"); // NOI18N
        jToolBar1.add(jSeparator7);

        jLabel1.setLabelFor(jSpinner1);
        jLabel1.setText(resourceMap.getString("jLabel1.text")); // NOI18N
        jLabel1.setName("jLabel1"); // NOI18N
        jToolBar1.add(jLabel1);

        jSpinner1.setMaximumSize(new java.awt.Dimension(32767, 22));
        jSpinner1.setMinimumSize(new java.awt.Dimension(0, 0));
        jSpinner1.setName("jSpinner1"); // NOI18N
        jSpinner1.setPreferredSize(new java.awt.Dimension(20, 20));
        jSpinner1.setValue(1);
        jSpinner1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jSpinner1StateChanged(evt);
            }
        });
        jToolBar1.add(jSpinner1);
        jSpinner1.getAccessibleContext().setAccessibleDescription(resourceMap.getString("jSpinner1.AccessibleContext.accessibleDescription")); // NOI18N

        jLabel2.setLabelFor(jSpinner2);
        jLabel2.setText(resourceMap.getString("jLabel2.text")); // NOI18N
        jLabel2.setName("jLabel2"); // NOI18N
        jToolBar1.add(jLabel2);

        jSpinner2.setMaximumSize(new java.awt.Dimension(32767, 22));
        jSpinner2.setName("jSpinner2"); // NOI18N
        jSpinner2.setPreferredSize(new java.awt.Dimension(20, 20));
        jSpinner2.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jSpinner2StateChanged(evt);
            }
        });
        jToolBar1.add(jSpinner2);

        jSeparator1.setName("jSeparator1"); // NOI18N
        jToolBar1.add(jSeparator1);

        btBold.setBackground(resourceMap.getColor("btBold.background")); // NOI18N
        btBold.setIcon(resourceMap.getIcon("btBold.icon")); // NOI18N
        btBold.setToolTipText(resourceMap.getString("btBold.toolTipText")); // NOI18N
        btBold.setBorderPainted(false);
        btBold.setFocusable(false);
        btBold.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btBold.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btBold.setName("btBold"); // NOI18N
        btBold.setOpaque(false);
        btBold.setPreferredSize(new java.awt.Dimension(24, 24));
        btBold.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btBold.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btBoldActionPerformed(evt);
            }
        });
        jToolBar1.add(btBold);

        btItalic.setBackground(resourceMap.getColor("btItalic.background")); // NOI18N
        btItalic.setIcon(resourceMap.getIcon("btItalic.icon")); // NOI18N
        btItalic.setToolTipText(resourceMap.getString("btItalic.toolTipText")); // NOI18N
        btItalic.setBorderPainted(false);
        btItalic.setFocusable(false);
        btItalic.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btItalic.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btItalic.setName("btItalic"); // NOI18N
        btItalic.setOpaque(false);
        btItalic.setPreferredSize(new java.awt.Dimension(24, 24));
        btItalic.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btItalic.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btItalicActionPerformed(evt);
            }
        });
        jToolBar1.add(btItalic);

        btTypeWriter.setBackground(resourceMap.getColor("btTypeWriter.background")); // NOI18N
        btTypeWriter.setIcon(resourceMap.getIcon("btTypeWriter.icon")); // NOI18N
        btTypeWriter.setToolTipText(resourceMap.getString("btTypeWriter.toolTipText")); // NOI18N
        btTypeWriter.setBorderPainted(false);
        btTypeWriter.setFocusable(false);
        btTypeWriter.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btTypeWriter.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btTypeWriter.setName("btTypeWriter"); // NOI18N
        btTypeWriter.setOpaque(false);
        btTypeWriter.setPreferredSize(new java.awt.Dimension(24, 24));
        btTypeWriter.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btTypeWriter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btTypeWriterActionPerformed(evt);
            }
        });
        jToolBar1.add(btTypeWriter);

        jSeparator3.setName("jSeparator3"); // NOI18N
        jToolBar1.add(jSeparator3);

        btHorizontalLeft.setBackground(resourceMap.getColor("btHorizontalLeft.background")); // NOI18N
        btHorizontalLeft.setIcon(resourceMap.getIcon("btHorizontalLeft.icon")); // NOI18N
        btHorizontalLeft.setToolTipText(resourceMap.getString("btHorizontalLeft.toolTipText")); // NOI18N
        btHorizontalLeft.setBorderPainted(false);
        btHorizontalLeft.setFocusable(false);
        btHorizontalLeft.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btHorizontalLeft.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btHorizontalLeft.setName("btHorizontalLeft"); // NOI18N
        btHorizontalLeft.setOpaque(false);
        btHorizontalLeft.setPreferredSize(new java.awt.Dimension(24, 24));
        btHorizontalLeft.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btHorizontalLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btHorizontalLeftActionPerformed(evt);
            }
        });
        jToolBar1.add(btHorizontalLeft);

        btHorizontalCenter.setBackground(resourceMap.getColor("btHorizontalCenter.background")); // NOI18N
        btHorizontalCenter.setIcon(resourceMap.getIcon("btHorizontalCenter.icon")); // NOI18N
        btHorizontalCenter.setToolTipText(resourceMap.getString("btHorizontalCenter.toolTipText")); // NOI18N
        btHorizontalCenter.setBorderPainted(false);
        btHorizontalCenter.setFocusable(false);
        btHorizontalCenter.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btHorizontalCenter.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btHorizontalCenter.setName("btHorizontalCenter"); // NOI18N
        btHorizontalCenter.setOpaque(false);
        btHorizontalCenter.setPreferredSize(new java.awt.Dimension(24, 24));
        btHorizontalCenter.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btHorizontalCenter.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btHorizontalCenterActionPerformed(evt);
            }
        });
        jToolBar1.add(btHorizontalCenter);

        btHorizontalRight.setBackground(resourceMap.getColor("btHorizontalRight.background")); // NOI18N
        btHorizontalRight.setIcon(resourceMap.getIcon("btHorizontalRight.icon")); // NOI18N
        btHorizontalRight.setToolTipText(resourceMap.getString("btHorizontalRight.toolTipText")); // NOI18N
        btHorizontalRight.setBorderPainted(false);
        btHorizontalRight.setFocusable(false);
        btHorizontalRight.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btHorizontalRight.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btHorizontalRight.setName("btHorizontalRight"); // NOI18N
        btHorizontalRight.setOpaque(false);
        btHorizontalRight.setPreferredSize(new java.awt.Dimension(24, 24));
        btHorizontalRight.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btHorizontalRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btHorizontalRightActionPerformed(evt);
            }
        });
        jToolBar1.add(btHorizontalRight);

        btSluc.setBackground(resourceMap.getColor("btSluc.background")); // NOI18N
        btSluc.setIcon(resourceMap.getIcon("btSluc.icon")); // NOI18N
        btSluc.setText(resourceMap.getString("btSluc.text")); // NOI18N
        btSluc.setToolTipText(resourceMap.getString("btSluc.toolTipText")); // NOI18N
        btSluc.setBorderPainted(false);
        btSluc.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btSluc.setName("btSluc"); // NOI18N
        btSluc.setOpaque(false);
        btSluc.setPreferredSize(new java.awt.Dimension(24, 24));
        btSluc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btSlucActionPerformed(evt);
            }
        });
        jToolBar1.add(btSluc);

        jLabel3.setText(resourceMap.getString("jLabel3.text")); // NOI18N
        jLabel3.setName("jLabel3"); // NOI18N
        jToolBar1.add(jLabel3);

        btWidth.setBackground(resourceMap.getColor("btWidth.background")); // NOI18N
        btWidth.setIcon(resourceMap.getIcon("btWidth.icon")); // NOI18N
        btWidth.setToolTipText(resourceMap.getString("btWidth.toolTipText")); // NOI18N
        btWidth.setBorderPainted(false);
        btWidth.setFocusable(false);
        btWidth.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btWidth.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btWidth.setName("btWidth"); // NOI18N
        btWidth.setOpaque(false);
        btWidth.setPreferredSize(new java.awt.Dimension(24, 24));
        btWidth.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btWidth.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btWidthActionPerformed(evt);
            }
        });
        jToolBar1.add(btWidth);

        btHeight.setBackground(resourceMap.getColor("btHeight.background")); // NOI18N
        btHeight.setIcon(resourceMap.getIcon("btHeight.icon")); // NOI18N
        btHeight.setToolTipText(resourceMap.getString("btHeight.toolTipText")); // NOI18N
        btHeight.setBorderPainted(false);
        btHeight.setFocusable(false);
        btHeight.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
        btHeight.setMargin(new java.awt.Insets(2, 2, 2, 2));
        btHeight.setName("btHeight"); // NOI18N
        btHeight.setOpaque(false);
        btHeight.setPreferredSize(new java.awt.Dimension(24, 24));
        btHeight.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
        btHeight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btHeightActionPerformed(evt);
            }
        });
        jToolBar1.add(btHeight);

        jSeparator2.setName("jSeparator2"); // NOI18N
        jToolBar1.add(jSeparator2);

        spBorder.setModel(new javax.swing.SpinnerNumberModel(Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1)));
        spBorder.setAutoscrolls(true);
        spBorder.setMaximumSize(new java.awt.Dimension(50, 22));
        spBorder.setMinimumSize(new java.awt.Dimension(50, 50));
        spBorder.setName("spBorder"); // NOI18N
        spBorder.setPreferredSize(new java.awt.Dimension(50, 10));
        jToolBar1.add(spBorder);

        jLabel4.setText(resourceMap.getString("jLabel4.text")); // NOI18N
        jLabel4.setName("jLabel4"); // NOI18N
        jToolBar1.add(jLabel4);

        jScrollPane1.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.LOWERED));
        jScrollPane1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        jScrollPane1.setName("jScrollPane1"); // NOI18N

        javax.swing.GroupLayout mainPanelLayout = new javax.swing.GroupLayout(mainPanel);
        mainPanel.setLayout(mainPanelLayout);
        mainPanelLayout.setHorizontalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 766, Short.MAX_VALUE)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 735, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(31, Short.MAX_VALUE))
        );
        mainPanelLayout.setVerticalGroup(
            mainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(mainPanelLayout.createSequentialGroup()
                .addComponent(jToolBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 253, Short.MAX_VALUE))
        );

        menuBar.setName("menuBar"); // NOI18N

        fileMenu.setText(resourceMap.getString("fileMenu.text")); // NOI18N
        fileMenu.setName("fileMenu"); // NOI18N

        miNew.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
        miNew.setIcon(resourceMap.getIcon("miNew.icon")); // NOI18N
        miNew.setText(resourceMap.getString("miNew.text")); // NOI18N
        miNew.setName("miNew"); // NOI18N
        miNew.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miNewActionPerformed(evt);
            }
        });
        fileMenu.add(miNew);

        miOpenFile.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
        miOpenFile.setIcon(resourceMap.getIcon("miOpenFile.icon")); // NOI18N
        miOpenFile.setText(resourceMap.getString("miOpenFile.text")); // NOI18N
        miOpenFile.setName("miOpenFile"); // NOI18N
        miOpenFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miOpenFileActionPerformed(evt);
            }
        });
        fileMenu.add(miOpenFile);

        miSaveFile.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.CTRL_MASK));
        miSaveFile.setIcon(resourceMap.getIcon("miSaveFile.icon")); // NOI18N
        miSaveFile.setText(resourceMap.getString("miSaveFile.text")); // NOI18N
        miSaveFile.setName("miSaveFile"); // NOI18N
        miSaveFile.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miSaveFileActionPerformed(evt);
            }
        });
        fileMenu.add(miSaveFile);

        miSaveFileAs.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_S, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        miSaveFileAs.setText(resourceMap.getString("miSaveFileAs.text")); // NOI18N
        miSaveFileAs.setName("miSaveFileAs"); // NOI18N
        miSaveFileAs.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miSaveFileAsActionPerformed(evt);
            }
        });
        fileMenu.add(miSaveFileAs);

        jSeparator10.setName("jSeparator10"); // NOI18N
        fileMenu.add(jSeparator10);

        miSaveFileAs1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.SHIFT_MASK | java.awt.event.InputEvent.CTRL_MASK));
        miSaveFileAs1.setIcon(resourceMap.getIcon("miSaveFileAs1.icon")); // NOI18N
        miSaveFileAs1.setText(resourceMap.getString("miSaveFileAs1.text")); // NOI18N
        miSaveFileAs1.setName("miSaveFileAs1"); // NOI18N
        miSaveFileAs1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miSaveFileAs1ActionPerformed(evt);
            }
        });
        fileMenu.add(miSaveFileAs1);

        jSeparator5.setName("jSeparator5"); // NOI18N
        fileMenu.add(jSeparator5);

        javax.swing.ActionMap actionMap = org.jdesktop.application.Application.getInstance(latextablecreator.LatexTableCreatorApp.class).getContext().getActionMap(LatexTableCreatorView.class, this);
        exitMenuItem.setAction(actionMap.get("quit")); // NOI18N
        exitMenuItem.setText(resourceMap.getString("exitMenuItem.text")); // NOI18N
        exitMenuItem.setName("exitMenuItem"); // NOI18N
        fileMenu.add(exitMenuItem);

        menuBar.add(fileMenu);

        mEdit.setText(resourceMap.getString("mEdit.text")); // NOI18N
        mEdit.setName("mEdit"); // NOI18N

        miCopy.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_C, java.awt.event.InputEvent.CTRL_MASK));
        miCopy.setIcon(resourceMap.getIcon("miCopy.icon")); // NOI18N
        miCopy.setText(resourceMap.getString("miCopy.text")); // NOI18N
        miCopy.setName("miCopy"); // NOI18N
        miCopy.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miCopyActionPerformed(evt);
            }
        });
        mEdit.add(miCopy);

        miCut.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_X, java.awt.event.InputEvent.CTRL_MASK));
        miCut.setIcon(resourceMap.getIcon("miCut.icon")); // NOI18N
        miCut.setText(resourceMap.getString("miCut.text")); // NOI18N
        miCut.setName("miCut"); // NOI18N
        miCut.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miCutActionPerformed(evt);
            }
        });
        mEdit.add(miCut);

        miPaste.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, java.awt.event.InputEvent.CTRL_MASK));
        miPaste.setIcon(resourceMap.getIcon("miPaste.icon")); // NOI18N
        miPaste.setText(resourceMap.getString("miPaste.text")); // NOI18N
        miPaste.setName("miPaste"); // NOI18N
        miPaste.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miPasteActionPerformed(evt);
            }
        });
        mEdit.add(miPaste);

        jSeparator6.setName("jSeparator6"); // NOI18N
        mEdit.add(jSeparator6);

        miDel.setText(resourceMap.getString("miDel.text")); // NOI18N
        miDel.setName("miDel"); // NOI18N
        miDel.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miDelActionPerformed(evt);
            }
        });
        mEdit.add(miDel);

        menuBar.add(mEdit);

        mFormat.setText(resourceMap.getString("mFormat.text")); // NOI18N
        mFormat.setName("mFormat"); // NOI18N
        mFormat.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                mFormatActionPerformed(evt);
            }
        });

        miBold.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_B, java.awt.event.InputEvent.CTRL_MASK));
        miBold.setIcon(resourceMap.getIcon("miBold.icon")); // NOI18N
        miBold.setText(resourceMap.getString("miBold.text")); // NOI18N
        miBold.setName("miBold"); // NOI18N
        miBold.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miBoldActionPerformed(evt);
            }
        });
        mFormat.add(miBold);

        miItalic.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_I, java.awt.event.InputEvent.CTRL_MASK));
        miItalic.setIcon(resourceMap.getIcon("miItalic.icon")); // NOI18N
        miItalic.setText(resourceMap.getString("miItalic.text")); // NOI18N
        miItalic.setName("miItalic"); // NOI18N
        miItalic.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miItalicActionPerformed(evt);
            }
        });
        mFormat.add(miItalic);

        jMenuItem1.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_T, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem1.setIcon(resourceMap.getIcon("jMenuItem1.icon")); // NOI18N
        jMenuItem1.setText(resourceMap.getString("jMenuItem1.text")); // NOI18N
        jMenuItem1.setName("jMenuItem1"); // NOI18N
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        mFormat.add(jMenuItem1);

        jSeparator8.setName("jSeparator8"); // NOI18N
        mFormat.add(jSeparator8);

        miHL.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_L, java.awt.event.InputEvent.CTRL_MASK));
        miHL.setIcon(resourceMap.getIcon("miHL.icon")); // NOI18N
        miHL.setText(resourceMap.getString("miHL.text")); // NOI18N
        miHL.setName("miHL"); // NOI18N
        miHL.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miHLActionPerformed(evt);
            }
        });
        mFormat.add(miHL);

        miHC.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_E, java.awt.event.InputEvent.CTRL_MASK));
        miHC.setIcon(resourceMap.getIcon("miHC.icon")); // NOI18N
        miHC.setText(resourceMap.getString("miHC.text")); // NOI18N
        miHC.setName("miHC"); // NOI18N
        miHC.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miHCActionPerformed(evt);
            }
        });
        mFormat.add(miHC);

        miHR.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_R, java.awt.event.InputEvent.CTRL_MASK));
        miHR.setIcon(resourceMap.getIcon("miHR.icon")); // NOI18N
        miHR.setText(resourceMap.getString("miHR.text")); // NOI18N
        miHR.setName("miHR"); // NOI18N
        miHR.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miHRActionPerformed(evt);
            }
        });
        mFormat.add(miHR);

        jSeparator9.setName("jSeparator9"); // NOI18N
        mFormat.add(jSeparator9);

        miSluc.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_K, java.awt.event.InputEvent.CTRL_MASK));
        miSluc.setIcon(resourceMap.getIcon("miSluc.icon")); // NOI18N
        miSluc.setText(resourceMap.getString("miSluc.text")); // NOI18N
        miSluc.setName("miSluc"); // NOI18N
        miSluc.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                miSlucActionPerformed(evt);
            }
        });
        mFormat.add(miSluc);

        menuBar.add(mFormat);

        helpMenu.setText(resourceMap.getString("helpMenu.text")); // NOI18N
        helpMenu.setName("helpMenu"); // NOI18N

        aboutMenuItem.setAction(actionMap.get("showAboutBox")); // NOI18N
        aboutMenuItem.setText(resourceMap.getString("aboutMenuItem.text")); // NOI18N
        aboutMenuItem.setName("aboutMenuItem"); // NOI18N
        helpMenu.add(aboutMenuItem);

        menuBar.add(helpMenu);

        statusPanel.setMaximumSize(new java.awt.Dimension(32767, 25));
        statusPanel.setName("statusPanel"); // NOI18N
        statusPanel.setPreferredSize(new java.awt.Dimension(601, 25));
        statusPanel.setRequestFocusEnabled(false);

        statusPanelSeparator.setName("statusPanelSeparator"); // NOI18N

        statusMessageLabel.setText(resourceMap.getString("statusMessageLabel.text")); // NOI18N
        statusMessageLabel.setName("statusMessageLabel"); // NOI18N

        statusAnimationLabel.setName("statusAnimationLabel"); // NOI18N

        progressBar.setName("progressBar"); // NOI18N

        javax.swing.GroupLayout statusPanelLayout = new javax.swing.GroupLayout(statusPanel);
        statusPanel.setLayout(statusPanelLayout);
        statusPanelLayout.setHorizontalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(statusPanelSeparator, javax.swing.GroupLayout.DEFAULT_SIZE, 503, Short.MAX_VALUE)
                    .addGroup(statusPanelLayout.createSequentialGroup()
                        .addGap(15, 15, 15)
                        .addComponent(statusMessageLabel)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(101, 101, 101)
                .addComponent(statusAnimationLabel)
                .addContainerGap())
        );
        statusPanelLayout.setVerticalGroup(
            statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(statusPanelLayout.createSequentialGroup()
                .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(statusPanelLayout.createSequentialGroup()
                        .addComponent(statusPanelSeparator, javax.swing.GroupLayout.PREFERRED_SIZE, 2, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 17, Short.MAX_VALUE)
                        .addGroup(statusPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(statusMessageLabel)
                            .addComponent(statusAnimationLabel)))
                    .addComponent(progressBar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pmBorder.setName("pmBorder"); // NOI18N

        pmiNone.setIcon(resourceMap.getIcon("pmiNone.icon")); // NOI18N
        pmiNone.setToolTipText(resourceMap.getString("pmiNone.toolTipText")); // NOI18N
        pmiNone.setName("pmiNone"); // NOI18N
        pmiNone.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiNoneActionPerformed(evt);
            }
        });
        pmBorder.add(pmiNone);

        pmiFull.setIcon(resourceMap.getIcon("pmiFull.icon")); // NOI18N
        pmiFull.setToolTipText(resourceMap.getString("pmiFull.toolTipText")); // NOI18N
        pmiFull.setName("pmiFull"); // NOI18N
        pmiFull.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiFullActionPerformed(evt);
            }
        });
        pmBorder.add(pmiFull);

        pmiFrame.setIcon(resourceMap.getIcon("pmiFrame.icon")); // NOI18N
        pmiFrame.setToolTipText(resourceMap.getString("pmiFrame.toolTipText")); // NOI18N
        pmiFrame.setName("pmiFrame"); // NOI18N
        pmiFrame.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiFrameActionPerformed(evt);
            }
        });
        pmBorder.add(pmiFrame);

        pmiLeft.setIcon(resourceMap.getIcon("pmiLeft.icon")); // NOI18N
        pmiLeft.setText(resourceMap.getString("pmiLeft.text")); // NOI18N
        pmiLeft.setToolTipText(resourceMap.getString("pmiLeft.toolTipText")); // NOI18N
        pmiLeft.setName("pmiLeft"); // NOI18N
        pmiLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiLeftActionPerformed(evt);
            }
        });
        pmBorder.add(pmiLeft);

        pmiTop.setIcon(resourceMap.getIcon("pmiTop.icon")); // NOI18N
        pmiTop.setToolTipText(resourceMap.getString("pmiTop.toolTipText")); // NOI18N
        pmiTop.setName("pmiTop"); // NOI18N
        pmiTop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiTopActionPerformed(evt);
            }
        });
        pmBorder.add(pmiTop);

        pmiRight.setIcon(resourceMap.getIcon("pmiRight.icon")); // NOI18N
        pmiRight.setToolTipText(resourceMap.getString("pmiRight.toolTipText")); // NOI18N
        pmiRight.setName("pmiRight"); // NOI18N
        pmiRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiRightActionPerformed(evt);
            }
        });
        pmBorder.add(pmiRight);

        pmiBottom.setIcon(resourceMap.getIcon("pmiBottom.icon")); // NOI18N
        pmiBottom.setToolTipText(resourceMap.getString("pmiBottom.toolTipText")); // NOI18N
        pmiBottom.setName("pmiBottom"); // NOI18N
        pmiBottom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiBottomActionPerformed(evt);
            }
        });
        pmBorder.add(pmiBottom);

        pmiDLeft.setIcon(resourceMap.getIcon("pmiDLeft.icon")); // NOI18N
        pmiDLeft.setToolTipText(resourceMap.getString("pmiDLeft.toolTipText")); // NOI18N
        pmiDLeft.setName("pmiDLeft"); // NOI18N
        pmiDLeft.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiDLeftActionPerformed(evt);
            }
        });
        pmBorder.add(pmiDLeft);

        pmiDTop.setIcon(resourceMap.getIcon("pmiDTop.icon")); // NOI18N
        pmiDTop.setToolTipText(resourceMap.getString("pmiDTop.toolTipText")); // NOI18N
        pmiDTop.setName("pmiDTop"); // NOI18N
        pmiDTop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiDTopActionPerformed(evt);
            }
        });
        pmBorder.add(pmiDTop);

        pmiDRight.setIcon(resourceMap.getIcon("pmiDRight.icon")); // NOI18N
        pmiDRight.setToolTipText(resourceMap.getString("pmiDRight.toolTipText")); // NOI18N
        pmiDRight.setName("pmiDRight"); // NOI18N
        pmiDRight.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiDRightActionPerformed(evt);
            }
        });
        pmBorder.add(pmiDRight);

        pmiDBottom.setIcon(resourceMap.getIcon("pmiDBottom.icon")); // NOI18N
        pmiDBottom.setToolTipText(resourceMap.getString("pmiDBottom.toolTipText")); // NOI18N
        pmiDBottom.setName("pmiDBottom"); // NOI18N
        pmiDBottom.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                pmiDBottomActionPerformed(evt);
            }
        });
        pmBorder.add(pmiDBottom);

        setComponent(mainPanel);
        setMenuBar(menuBar);
        setStatusBar(statusPanel);
    }// </editor-fold>//GEN-END:initComponents
     
     
     /**
      * Reaguje na změnu počtu řádků v Sinneru
      * Přidá/odebere patřičné řádky z babulky (a splatého modelu)
      * Při přidání provede inicializaci headeru.
      * @param  evt událost (nevyužito)
      */
     private void jSpinner2StateChanged(javax.swing.event.ChangeEvent evt)//GEN-FIRST:event_jSpinner2StateChanged
     {
          //zjistim kolik uzivatel nastavil řádků
          int row_set = (Integer)jSpinner2.getValue();
          
          //zkontroluji, zda se uzivatel nepokusil nastavit pocet radku mensi jak 1
          if (row_set < 1)
          {
               jSpinner2.setValue(1);
               return;
          }
          
          //zjistim, kolik ma tabulka radku
          int row_count = jTable1.getRowCount();
          
          while (row_set != row_count) //zajistí přidání odebrání více řádků
               if (row_set > row_count)
               {
                    //Musí se pracova přímo s modelem!!
                    int column_count = jTable1.getColumnCount();
                    Vector<String> line = new Vector<String>(column_count); //vytvoříme prázdný řádek s daty
                    line.setSize(column_count);
                    model.addRow(line); //musí obsahovat data
                    rowHeaderModel.addRow(new Object [] {"" + model.getRowCount()}); //aktuální číslo řádku
                    row_count++;
               }
               else if (row_set < row_count)
               {
               
                    //Musí se pracova přímo s modelem!!
                    model.removeRow(row_count - 1);//) //otestováno pouze na poslední sloupec!!!
                    
                    row_count--;
                    
                    if (row_count != jTable1.getRowCount())
                    {
                         //sloupec nelze odstranit (sloučené buňky)
                         row_count = jTable1.getRowCount();
                         jSpinner2.setValue(row_count);
                         return;
                    }
                    else
                    {
                         rowHeaderModel.removeRow(row_count);
                    }
                    
               }
     }//GEN-LAST:event_jSpinner2StateChanged
     
     /**
      * Reaguje na změnu počtu sloupců v Sinneru
      * Přidá/odebere patřičné sloupce z babulky (a splatého modelu)
      * Při přidání provede inicializaci headeru.
      * @param  evt událost (nevyužito)
      */
     private void jSpinner1StateChanged(javax.swing.event.ChangeEvent evt)//GEN-FIRST:event_jSpinner1StateChanged
     {
          //zjistim kolik uzivatel nastavil sloupcu
          int column_set = (Integer)jSpinner1.getValue();
          
          //uložíme si rozměry sloupců
          jTable1.rememberColWidths();
          
          
          //zkontroluji, zda se uzivatel nepokusil nastavit pocet sloupcu mensi jak 1
          if (column_set < 1)
          {
               jSpinner1.setValue(1);
               return;
          }
          
          //zjistim, kolik ma tabulka sloupcu
          int column_count = jTable1.getColumnCount();
          
          while (column_set != column_count) //zajistí přidání odebrání více sloupců
               if (column_set > column_count)
               {
                    //Musí se pracova přímo s modelem!!
                    
                    String str; //Vypočítáme pořadový kód sloupce
                    str = "";
                    
                    int count = model.getColumnCount();
                    
                    str = Character.forDigit(10 + (count % 26), Character.MAX_RADIX) + str;
                    count = count / 26; //A-> AA -> ZZ ->xxx jiz nezabespečen !!!!!
                    
                    while (count > 0)
                    {
                         str = Character.forDigit(10 + (count % 26) - 1, Character.MAX_RADIX) + str;
                         count = count / 26;
                    }
                    
                    
                    
                    model.addColumn(str.toUpperCase());
                    column_count++;
                    
                    //znovunastavíme rozměry
                    ((RowHeaderTableUI) rowHeader.getUI()).setMainTableHeights(); //řádků
                    jTable1.setColWidths(); //sloupců
               }
               else if (column_set < column_count) ///odebereme
               {
                    //Musí se pracova přímo s modelem!!
                    if (!model.removeColumn(column_count - 1)) //otestováno pouze na poslední sloupec!!!
                    {
                         //sloupec nelze odstranit (sloučené buňky)
                         column_count = jTable1.getColumnCount();
                         jSpinner1.setValue(column_count);
                         return;
                    }
                    
                    column_count--;
                    
                    //znovunastavíme rozměry
                    ((RowHeaderTableUI) rowHeader.getUI()).setMainTableHeights(); //řádků
                    jTable1.setColWidths(); //sloupců
               }
               
     }//GEN-LAST:event_jSpinner1StateChanged
     
     /**
      * Sloučí/rozdělí vybrané buňky.
      * Sloučení nezle provést, pokud je již nějaké buňka sloučená -> zobrazení dialogu
      * Rozdělení se provede právě tehdy, je-li levé horní buňka výběru sloučená.
      * @param  evt událost (nevyužito)
      */
     private void btSlucActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btSlucActionPerformed
     {
          //slučování
          int[] columns = jTable1.getSelectedColumns();
          int[] rows    = jTable1.getSelectedRows();
          
          //nic není vybráno
          if (columns.length < 1) return;
          
          if (rows.length < 1) return;
          
          int col = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
          int row    = jTable1.getSelectionModel().getMinSelectionIndex();
          
          if (cellAtt.isCombined(row, col)) //rozdělení
          {
               //rozdělování
               cellAtt.split(row, col);
               jTable1.revalidate();
               jTable1.repaint();
               btSluc.setSelected(false);
          }
          else //sloučení
          {
               if (cellAtt.combine(rows, columns)) //pokusíme se sloučit
               {
                    jTable1.setColumnSelectionInterval(col, col);
                    jTable1.setRowSelectionInterval(row, row);
                    jTable1.revalidate();
                    jTable1.repaint();
                    btSluc.setSelected(true);
               }
               else //nelze -> dialog
               {
                    JOptionPane.showMessageDialog(this.getFrame(), "Nelze sloučit již sloučené buňky.", "Chyba:", JOptionPane.ERROR_MESSAGE);
               }
          }
     }//GEN-LAST:event_btSlucActionPerformed
     
     /**
      * Nastaví dolní rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (null->dvojitý)
      */
     private void pmiBottomActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiBottomActionPerformed
     {
          btBorder.setIcon(pmiBottom.getIcon());
          pmiActualBorder = pmiBottom;
          //nastaví levý rámeček
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          CellSpan   cellSpan   = (CellSpan)  model.getCellAttribute();
          
          int[] cols = jTable1.getSelectedColumns();
          int[] rows    = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          //projdeme všechny sloupce ve výběru.
          for (int i = 0; i < cols.length; i++)
          {
               int side = LinesBorder.NORTH; //budeme nastavovat severní rámeček do buňky pod výběrem !!!
               int col  = cols[i];
               int row = jTable1.getSelectionModel().getMaxSelectionIndex(); //zjistíme spodní řádek
               
               //zjistíme hlavní sloučenou buňku (pokud je sloučená)
               for (int b = 0; b < 2; b++)   //právě 2 průchody
               {
                    int col_offset = cellSpan.getSpan(row, col)[CellSpan.COLUMN];
                    int row_offset = cellSpan.getSpan(row, col)[CellSpan.ROW];
                    
                    
                    if (row_offset < 0) row += row_offset; //buňka je skrytá -> hledáme pozici hlavní buňky
                    
                    if (col_offset < 0) col += col_offset;
               }
               
               //nyní máme vždy viditelnou buňku -> zjistíme její parametry
               int corX = cellSpan.getSpan(row, col)[CellSpan.COLUMN];
               int corY = cellSpan.getSpan(row, col)[CellSpan.ROW];
               
               
               corX--; //korekce sloupce
               
               if (row + corY > jTable1.getRowCount() - 1) //zjistíme, zda nejsme mimo rozsah
               {
                    side = LinesBorder.SOUTH;
                    corY = 0;
               }
               
               while (corX >= 0)
               {
                    LinesBorder border  = (LinesBorder) cellBorder.getBorder(row + corY, col + corX);
                    
                    if (border == null) border  = new LinesBorder(Color.BLACK, 0);
                    
                    border.setInnerThickness((Integer) spBorder.getValue(), side);
                    
                    if (evt == null)
                    {
                         border.setOuterThickness((Integer) spBorder.getValue(), side);
                    }
                    else
                         border.setOuterThickness(0, side);
                         
                    cellBorder.setBorder(border, row + corY, col + corX);
                    corX--;
               }
          }
          
          jTable1.revalidate();
          jTable1.repaint();
     }//GEN-LAST:event_pmiBottomActionPerformed
     
     /**
      * Nastaví pravý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (null->dvojitý)
      */
     private void pmiRightActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiRightActionPerformed
     {
          btBorder.setIcon(pmiRight.getIcon());
          pmiActualBorder = pmiRight;
          //nastaví rámeček
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          CellSpan   cellSpan   = (CellSpan)  model.getCellAttribute();
          
          int[] columns = jTable1.getSelectedColumns();
          int[] rows    = jTable1.getSelectedRows();
          
          //nic není vybráno
          if (columns.length < 1) return;
          
          if (rows.length < 1) return;
          
          for (int i = 0; i < rows.length; i++) //projdeme všechny řádky
          {
               int side = LinesBorder.WEST; //budeme nastavovat levý rámeček buňce vpravo
               int col = jTable1.getColumnModel().getSelectionModel().getMaxSelectionIndex();
               int row  = rows[i];
               
               //zjistíme hlavní sloučenou buňku
               for (int b = 0; b < 2; b++)   //právě 2 průchody
               {
                    int col_offset = cellSpan.getSpan(row, col)[CellSpan.COLUMN];
                    int row_offset = cellSpan.getSpan(row, col)[CellSpan.ROW];
                    
                    if (row_offset < 0) row += row_offset;
                    
                    if (col_offset < 0) col += col_offset;
               }
               
               //nyní máme vždy viditelnou buňku -> zjistíme její parametry
               int corX = cellSpan.getSpan(row, col)[CellSpan.COLUMN];
               int corY = cellSpan.getSpan(row, col)[CellSpan.ROW];
               
               corY--; //korekce řádku
               
               //pokud je sloupec poslední, vyznačíme pravou částn na místo levé
               if (col + corX >= jTable1.getColumnCount())
               {
                    side = LinesBorder.EAST;
                    corX = 0;
               }
               
               //pro sloučené buňky provedeme několikrát.
               while (corY >= 0)
               {
                    LinesBorder border  = (LinesBorder) cellBorder.getBorder(row + corY, col + corX);
                    
                    if (border == null) border  = new LinesBorder(Color.BLACK, 0);
                    
                    border.setInnerThickness((Integer) spBorder.getValue(), side);
                    
                    if (evt == null)
                         border.setOuterThickness((Integer) spBorder.getValue(), side);
                    else
                         border.setOuterThickness(0, side);
                         
                    cellBorder.setBorder(border, row + corY, col + corX);
                    corY--;
               }
          }
          
          jTable1.revalidate();
          jTable1.repaint();
     }//GEN-LAST:event_pmiRightActionPerformed
     
     
     /**
      * Nastaví horní rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (null -> dvojitý)
      */
     private void pmiTopActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiTopActionPerformed
     {
          btBorder.setIcon(pmiTop.getIcon());
          pmiActualBorder = pmiTop;
          
          //nastaví rámeček
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          
          int[] cols = jTable1.getSelectedColumns();
          int[] rows = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          int row = jTable1.getSelectionModel().getMinSelectionIndex();
          
          //nastavíme všem buňkám v prvním řádku v horní rámeček - funguje korektně i se sloučenými buňkami
          for (int i = 0; i < cols.length; i++)
          {
               LinesBorder border  = (LinesBorder) cellBorder.getBorder(row, cols[i]);
               
               if (border == null) border  = new LinesBorder(Color.BLACK, 0);
               
               border.setInnerThickness((Integer) spBorder.getValue(), LinesBorder.NORTH);
               
               if (evt == null)
                    border.setOuterThickness((Integer) spBorder.getValue(), LinesBorder.NORTH);
               else
                    border.setOuterThickness(0, LinesBorder.NORTH);
                    
               cellBorder.setBorder(border, row, cols[i]);
          }
          
          jTable1.revalidate();
          jTable1.repaint();
     }//GEN-LAST:event_pmiTopActionPerformed
     
     /**
      * Nastaví levý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (null -> dvojitý)
      */
     private void pmiLeftActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiLeftActionPerformed
     {
          btBorder.setIcon(pmiLeft.getIcon());
          pmiActualBorder = pmiLeft;
          
          //nastaví levý rámeček
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          
          int[] columns = jTable1.getSelectedColumns();
          int[] rows    = jTable1.getSelectedRows();
          
          if (columns.length < 1) return;
          
          if (rows.length < 1) return;
          
          int minCol = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
          
          for (int i = 0; i < rows.length; i++)
          {
               LinesBorder border  = (LinesBorder) cellBorder.getBorder(rows[i], minCol);
               
               if (border == null) border  = new LinesBorder(Color.BLACK, 0);
               
               border.setInnerThickness((Integer) spBorder.getValue(), LinesBorder.WEST);
               
               if (evt == null)
                    border.setOuterThickness((Integer) spBorder.getValue(), LinesBorder.WEST);
               else
                    border.setOuterThickness(0, LinesBorder.WEST);
                    
               cellBorder.setBorder(border, rows[i], minCol);
          }
          
          jTable1.revalidate();
          jTable1.repaint();
     }//GEN-LAST:event_pmiLeftActionPerformed
     
     /**
      * Vymaře všechny rámečky buněk ve vybrané obsalsti
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiNoneActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiNoneActionPerformed
     {
          //nastaví levý rámeček
          btBorder.setIcon(pmiNone.getIcon());
          pmiActualBorder = pmiNone;
          
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          
          int[] cols = jTable1.getSelectedColumns();
          int[] rows    = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          for (int i = 0; i < rows.length; i++) //projdeme všechny buňky ve výběru
               for (int j = 0; j < cols.length; j++)
               {
                    LinesBorder border  = (LinesBorder) cellBorder.getBorder(rows[i], cols[j]);
                    
                    if (border == null) border  = new LinesBorder(Color.BLACK, 0); //nulová tloušťka
                    
                    border.setInnerThickness(0);
                    border.setOuterThickness(0);
                    cellBorder.setBorder(border, rows[i], cols[j]);
               }
               
          jTable1.revalidate();
          jTable1.repaint();
     }//GEN-LAST:event_pmiNoneActionPerformed
     
     /**
      * Solid rámeček. Nastaví rámeček všem buňkám ve výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiFullActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiFullActionPerformed
     {
          btBorder.setIcon(pmiFull.getIcon());
          pmiActualBorder = pmiFull;
          
          //nastaví levý rámeček
          CellBorder cellBorder = (CellBorder)model.getCellAttribute();
          
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          //int col = jTable1.getColumnModel().getSelectionModel().getMaxSelectionIndex();
          
          for (int i = 0; i < rows.length; i++)
               for (int j = 0; j < cols.length; j++)
               {
                    LinesBorder border  = (LinesBorder) cellBorder.getBorder(rows[i], cols[j]);
                    
                    if (border == null) border  = new LinesBorder(Color.BLACK, 0);
                    
                    border.setInnerThickness((Integer) spBorder.getValue(), LinesBorder.WEST);
                    border.setOuterThickness(0, LinesBorder.WEST);
                    border.setInnerThickness((Integer) spBorder.getValue(), LinesBorder.NORTH);
                    border.setOuterThickness(0, LinesBorder.NORTH);
                    cellBorder.setBorder(border, rows[i], cols[j]);
               }
               
          pmiBottom.doClick(); //nyní je třeba doplnit pouze dolní a pravý okraj oblasti
          pmiRight.doClick();
          
          btBorder.setIcon(pmiFull.getIcon());
          pmiActualBorder = pmiFull;
     }//GEN-LAST:event_pmiFullActionPerformed
     
     /**
      * Nastaví rámeček dle okolí výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (null -> dvojitý)
      */
     private void pmiFrameActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiFrameActionPerformed
     {
     
          pmiLeft.doClick(); //levý
          pmiTop.doClick();  //horní
          pmiBottom.doClick(); //pravý
          pmiRight.doClick(); //dolní
          
          btBorder.setIcon(pmiFrame.getIcon());
          pmiActualBorder = pmiFrame;
     }//GEN-LAST:event_pmiFrameActionPerformed
     
     /**
      * Nastaví levý dvojitý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiDLeftActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiDLeftActionPerformed
     {
     
          pmiLeftActionPerformed(null);
          btBorder.setIcon(pmiDLeft.getIcon());
          pmiActualBorder = pmiDLeft;
     }//GEN-LAST:event_pmiDLeftActionPerformed
     /**
      * Nastaví dolní dvojitý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiDBottomActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiDBottomActionPerformed
     {
          pmiBottomActionPerformed(null);
          btBorder.setIcon(pmiDBottom.getIcon());
          pmiActualBorder = pmiDBottom;
     }//GEN-LAST:event_pmiDBottomActionPerformed
     /**
      * Nastaví horní dvojitý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiDTopActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiDTopActionPerformed
     {
          pmiTopActionPerformed(null);
          btBorder.setIcon(pmiDTop.getIcon());
          pmiActualBorder = pmiDTop;
     }//GEN-LAST:event_pmiDTopActionPerformed
     /**
      * Nastaví pravý dvojitý rámeček dle aktuálního výběru.
      * Přiřadí do <code>pmiActualBorder</code> aktuální rámeček.
      * Pracuje i se loučenými buňkami -> nutné korektní nastavní rámečku !!!!
      * @param  evt událost (nevyužito)
      */
     private void pmiDRightActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_pmiDRightActionPerformed
     {
          pmiRightActionPerformed(null);
          btBorder.setIcon(pmiDRight.getIcon());
          pmiActualBorder = pmiDRight;
     }//GEN-LAST:event_pmiDRightActionPerformed
     /**
      * Zobrazí dialog pro změnu šířky sloupce.
      * V případě, že není nic vybráno -> zobrazí varovný dialog
      * @param  evt událost (nevyužito)
      */
     private void btWidthActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btWidthActionPerformed
     {
          if (jTable1.getSelectedColumns().length <= 0)
          {
               JOptionPane.showMessageDialog(this.getFrame(), "Musíte vybrat alespoň jeden sloupec!", "Zpráva:", JOptionPane.WARNING_MESSAGE);
               return;
          }
          
          sizeDialog = new SizeDialog(null, true); //inicializace
          sizeDialog.setModeWidths(true);  //režim - sloupce
          sizeDialog.setTable(jTable1); //globální tabulka
          sizeDialog.setIndex(jTable1.getSelectedColumn()); //vybraný sloupec
          sizeDialog.centerScreen(); //zabrazí dialog uprostřed obrazovky
     }//GEN-LAST:event_btWidthActionPerformed
     /**
      * Zobrazí dialog pro změnu výšky řádku
      * V případě, že není nic vybráno -> zobrazí varovný dialog
      * @param  evt událost (nevyužito)
      */
     private void btHeightActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btHeightActionPerformed
     {
          if (jTable1.getSelectedRows().length <= 0)
          {
               JOptionPane.showMessageDialog(this.getFrame(), "Musíte vybrat alespoň jeden řádek!", "Zpráva:", JOptionPane.WARNING_MESSAGE);
               return;
          }
          
          sizeDialog = new SizeDialog(null, true); //inicializace
          sizeDialog.setModeWidths(false); //režim -> řádky
          sizeDialog.setTable(jTable1); //globální tabulka
          sizeDialog.setRowHeader(rowHeader); //rowheader tabulka
          sizeDialog.setIndex(jTable1.getSelectedRow()); //vybraný řádek
          sizeDialog.centerScreen(); //zobrazí dialog uprostřed obrazovky
     }//GEN-LAST:event_btHeightActionPerformed
     
     /**
      * Nastaví tučný řez písma ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void btBoldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btBoldActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          //test na výběr
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          int colMin = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
          int rowMin = jTable1.getSelectionModel().getMinSelectionIndex();
          
          if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_B) == CellFont.FLAG_B) //B->Bold->Tučné
          { //zruší nastavení
               cellFont.unsetFontAtt(CellFont.FLAG_B, rows, cols);
               btBold.setSelected(false);
          }
          else
          {//nastaví
               cellFont.setFontAtt(CellFont.FLAG_B, rows, cols);
               btBold.setSelected(true);
          }
          
          jTable1.repaint();
     }//GEN-LAST:event_btBoldActionPerformed
     
     /**
      * Nastaví kurzívu ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void btItalicActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btItalicActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          //testo na výběr
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          int colMin = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
          int rowMin = jTable1.getSelectionModel().getMinSelectionIndex();
          
          if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_I) == CellFont.FLAG_I) //I->Italic->Kurzíva
          {//odnastaví
               cellFont.unsetFontAtt(CellFont.FLAG_I, rows, cols);
               btItalic.setSelected(false);
          }
          else
          {//nasataví
               cellFont.setFontAtt(CellFont.FLAG_I, rows, cols);
               btItalic.setSelected(true);
          }
          
          jTable1.repaint();
     }//GEN-LAST:event_btItalicActionPerformed
     
     /**
      * Nastaví písmo s pevnou šířkou znaku (TT) ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void btTypeWriterActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btTypeWriterActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          int colMin = jTable1.getColumnModel().getSelectionModel().getMinSelectionIndex();
          int rowMin = jTable1.getSelectionModel().getMinSelectionIndex();
          
          if ((cellFont.getFontAtt(rowMin, colMin) & CellFont.FLAG_T) == CellFont.FLAG_T) //T->TT
          {
               cellFont.unsetFontAtt(CellFont.FLAG_T, rows, cols);
               btTypeWriter.setSelected(false);
          }
          else
          {
               cellFont.setFontAtt(CellFont.FLAG_T, rows, cols);
               btTypeWriter.setSelected(true);
          }
          
          jTable1.repaint();
     }//GEN-LAST:event_btTypeWriterActionPerformed
     
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách doleva.
      * @param  evt událost (nevyužito)
      */
     private void btHorizontalLeftActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btHorizontalLeftActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          //      A1 A2
          //Levo  0  0
          //Střed 0  1
          //Pravo 1  1
          cellFont.unsetFontAtt(CellFont.FLAG_H_A1 | CellFont.FLAG_H_A2, rows, cols);
          btHorizontalLeft.setSelected(true);
          btHorizontalCenter.setSelected(false);
          btHorizontalRight.setSelected(false);
          jTable1.repaint();
     }//GEN-LAST:event_btHorizontalLeftActionPerformed
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách na střed.
      * @param  evt událost (nevyužito)
      */
     private void btHorizontalCenterActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btHorizontalCenterActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          //      A1 A2
          //Levo  0  0
          //Střed 0  1
          //Pravo 1  1
          cellFont.unsetFontAtt(CellFont.FLAG_H_A2, rows, cols);
          cellFont.setFontAtt(CellFont.FLAG_H_A1, rows, cols);
          btHorizontalLeft.setSelected(false);
          btHorizontalCenter.setSelected(true);
          btHorizontalRight.setSelected(false);
          jTable1.repaint();
     }//GEN-LAST:event_btHorizontalCenterActionPerformed
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách na střed.
      * @param  evt událost (nevyužito)
      */
     private void btHorizontalRightActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btHorizontalRightActionPerformed
     {
          CellFont cellFont = (CellFont) model.getCellAttribute();
          int[] cols = jTable1.getSelectedColumns();
          int[] rows  = jTable1.getSelectedRows();
          
          if (cols.length < 1) return;
          
          if (rows.length < 1) return;
          
          //      A1 A2
          //Levo  0  0
          //Střed 0  1
          //Pravo 1  1
          cellFont.setFontAtt(CellFont.FLAG_H_A1 | CellFont.FLAG_H_A2, rows, cols);
          btHorizontalLeft.setSelected(false);
          btHorizontalCenter.setSelected(false);
          btHorizontalRight.setSelected(true);
          jTable1.repaint();
     }//GEN-LAST:event_btHorizontalRightActionPerformed
     
     /**
      * Vyprázdní tabulku. (vytvoří mový model)
      * @param  evt událost (nevyužito)
      */
     private void miNewActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miNewActionPerformed
     {
          // TODO Dialog na neuložení?
          model = new AttributiveCellTableModel(
               new Object [][]
               {
                    {""}
               },
               new String []
               {
                    "A"
               }
          );
          rowHeaderModel  = new DefaultTableModel();
          rowHeaderModel.addColumn(""); //vždy bude mít jeden sloupec
          rowHeaderModel.addRow(new Object[] {"1"}); //a na začátku jeden řádek
          rowHeader.setModel(rowHeaderModel);
          
          jTable1.setModel(model);
          jSpinner1.setValue(1);
          jSpinner2.setValue(1);
     }//GEN-LAST:event_miNewActionPerformed
     
     /**
      * Vyprázdní tabulku. (vytvoří mový model)
      * @param  evt událost (nevyužito)
      */
     private void btNewFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btNewFileActionPerformed
     {
          miNewActionPerformed(evt);
     }//GEN-LAST:event_btNewFileActionPerformed

     /**
      * Otevre dialog pro otevreni souboru.
      *
      * @return Informace, zda bylo otevreni potvrzeno
      */
     private boolean openDialog()
     {
         String wd = System.getProperty("user.dir");
         JFileChooser fc = new JFileChooser(wd);

         fc.setFileFilter(csvFilter);
         fc.setFileFilter(csvFilterStrednik);
         //zakazu filtr *.*
         fc.setAcceptAllFileFilterUsed(false);

         int rc = fc.showDialog(null, "Select file");
         if (rc == JFileChooser.APPROVE_OPTION)
         {
             File file = fc.getSelectedFile();

             //jmeno souboru
             filename = file.getAbsolutePath();
             //zvoleny format souboru
             fileFilter = fc.getFileFilter();
                 
             //pokud uzivatel nevyplnil priponu, tak ji automaticky doplnim
             if (ExampleFileFilter.getExtension(file) == null)
             {
                 if (fileFilter == csvFilter)
                     filename += ".csv";
             }
         }
         else return false;

         return true;
     }
     
     /**
      *
      * @param  evt událost (nevyužito)
      */
     private void miOpenFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miOpenFileActionPerformed
     {
         if (openDialog() == true) {
             if (fileFilter == csvFilter) ImportExport.importCSV(filename,jTable1, jSpinner1, jSpinner2, ',');
             else if(fileFilter == csvFilterStrednik) ImportExport.importCSV(filename, jTable1, jSpinner1, jSpinner2, ';');
         }
         
     }//GEN-LAST:event_miOpenFileActionPerformed
     
     /**
      * Otevře soubor.
      * @param  evt událost (nevyužito)
      */
     private void btOpenFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btOpenFileActionPerformed
     {
          miOpenFileActionPerformed(evt);
     }//GEN-LAST:event_btOpenFileActionPerformed
     /**
       * Uloží soubor.
       * @param  evt událost (nevyužito)
       */
     private void btSaveFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btSaveFileActionPerformed
     {
          miSaveFileActionPerformed(evt);
     }//GEN-LAST:event_btSaveFileActionPerformed

     /**
      * Otevre dialog pro ulozeni souboru.
      * Jmeno souboru se ulozi do globalni promenne filename
      * Typ souboru se ulozi do promenne fileFilter
      *
      * @return Informace, zda bylo ulozeni potvrzeno
      */
     private boolean saveDialog()
     {
         String wd = System.getProperty("user.dir");
         JFileChooser fc = new JFileChooser(wd);

         fc.setFileFilter(texFilter);
         fc.setFileFilter(csvFilter);
         fc.setFileFilter(csvFilterStrednik);
         //zakazu filtr *.*
         fc.setAcceptAllFileFilterUsed(false);

         int rc = fc.showDialog(null, "Select file");
         if (rc == JFileChooser.APPROVE_OPTION)
         {
             File file = fc.getSelectedFile();

             //jmeno souboru
             filename = file.getAbsolutePath();
             //zvoleny format souboru
             fileFilter = fc.getFileFilter();
                 
             //pokud uzivatel nevyplnil priponu, tak ji automaticky doplnim
             if (ExampleFileFilter.getExtension(file) == null)
             {
                 if (fileFilter == texFilter)
                     filename += ".tex";
                 else if (fileFilter == csvFilter || fileFilter == csvFilterStrednik)
                     filename += ".csv";
             }
         }
         else return false;

         return true;
     }

     /**
      * Ulozi soubor se zadanym jmenem a se zadanym typem.
      * Jmeno je ulozeno v globalni promenne filename
      * Typ je ulozen v globalni promenne
      */
     private void saveFile()
     {
         String vystup="";


         if (fileFilter == texFilter)
             vystup = ImportExport.exportLatex(jTable1, cellAtt, model);
         else if (fileFilter == csvFilter)
             vystup = ImportExport.exportCSV(jTable1, cellAtt, ',');
         else if (fileFilter == csvFilterStrednik)
             vystup = ImportExport.exportCSV(jTable1, cellAtt, ';');
         else return;



         try {
              PrintWriter out = new PrintWriter(new FileWriter(filename));

              // Write text to file
              out.write(vystup);
              out.close();
         } catch (IOException e){
             e.printStackTrace();
         }
     }

     /**
       * Uloží soubor.
       * @param  evt událost (nevyužito)
       */
     private void miSaveFileActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miSaveFileActionPerformed
     {
         if (filename==null) {
             saveDialog();
         }

         saveFile();
     }//GEN-LAST:event_miSaveFileActionPerformed
     
     /**
      * Vloží data do vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void miPasteActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miPasteActionPerformed
     {
          jTable1.getClipboardAdapter().pasteFromClipboard();
     }//GEN-LAST:event_miPasteActionPerformed
     
     /**
      * Vyjme data z vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void miCutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miCutActionPerformed
     {
          jTable1.getClipboardAdapter().copyToClipboard(true);
     }//GEN-LAST:event_miCutActionPerformed
     
     /**
      * Kopíruje data z vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void miCopyActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miCopyActionPerformed
     {
          jTable1.getClipboardAdapter().copyToClipboard(false);
     }//GEN-LAST:event_miCopyActionPerformed
     
     /**
      * Vymaze data ve vybrané obsalti
      * @param  evt událost (nevyužito)
      */
     private void miDelActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miDelActionPerformed
     {
          jTable1.getClipboardAdapter().clear();
     }//GEN-LAST:event_miDelActionPerformed
     
     /**
      * Kopíruje data z vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void btCopyActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btCopyActionPerformed
     {
          jTable1.getClipboardAdapter().copyToClipboard(false);
     }//GEN-LAST:event_btCopyActionPerformed
     /**
      * Vyjme data z vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void btCutActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btCutActionPerformed
     {
          jTable1.getClipboardAdapter().copyToClipboard(true);
     }//GEN-LAST:event_btCutActionPerformed
     
     /**
      * Vloží data do vybrané oblasti.
      * @param  evt událost (nevyužito)
      */
     private void btPasteActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_btPasteActionPerformed
     {
          jTable1.getClipboardAdapter().pasteFromClipboard();
     }//GEN-LAST:event_btPasteActionPerformed
     
     private void mFormatActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_mFormatActionPerformed
     {
     
     }//GEN-LAST:event_mFormatActionPerformed
     
     /**
      * Nastaví tučný řez písma ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void miBoldActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miBoldActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btBoldActionPerformed(evt);
     }//GEN-LAST:event_miBoldActionPerformed
     
     /**
      * Nastaví kurzívu ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void miItalicActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miItalicActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btItalicActionPerformed(evt);
     }//GEN-LAST:event_miItalicActionPerformed
     
     /**
      * Nastaví písmo s pevnou šířkou znaku (TT) ve vybrané oblasti.
      * Nastavení/odnastavení je určeno dle levé horní buňky.
      * @param  evt událost (nevyužito)
      */
     private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_jMenuItem1ActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btTypeWriterActionPerformed(evt);
     }//GEN-LAST:event_jMenuItem1ActionPerformed
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách doleva.
      * @param  evt událost (nevyužito)
      */
     private void miHLActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miHLActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btHorizontalLeftActionPerformed(evt);
     }//GEN-LAST:event_miHLActionPerformed
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách na střed.
      * @param  evt událost (nevyužito)
      */
     private void miHCActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miHCActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btHorizontalCenterActionPerformed(evt);
     }//GEN-LAST:event_miHCActionPerformed
     
     /**
      * Nastaví horizontální zarovnání textu v buňkách doprava.
      * @param  evt událost (nevyužito)
      */
     private void miHRActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miHRActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btHorizontalRightActionPerformed(evt);
     }//GEN-LAST:event_miHRActionPerformed
     
     /**
      * Sloučí/rozdělí vybrané buňky.
      * Sloučení nezle provést, pokud je již nějaké buňka sloučená -> zobrazení dialogu
      * Rozdělení se provede právě tehdy, je-li levé horní buňka výběru sloučená.
      * @param  evt událost (nevyužito)
      */
     private void miSlucActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_miSlucActionPerformed
     {
          if (jTable1.getCellEditor() != null) jTable1.getCellEditor().cancelCellEditing();
          
          btSlucActionPerformed(evt);
     }//GEN-LAST:event_miSlucActionPerformed

     /**
      * Obsluha akce Save As
      */
     private void miSaveFileAsActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miSaveFileAsActionPerformed
         if (saveDialog() == true)
             saveFile();
     }//GEN-LAST:event_miSaveFileAsActionPerformed

     /**
      * Náhled
      */
     private void btPaste1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btPaste1ActionPerformed

         String vystup = ImportExport.exportLatex(jTable1, cellAtt, model);

         try {
              PrintWriter out = new PrintWriter(new FileWriter("tmp.tex"));

              // Write text to file
              out.write(vystup);
              out.close();
         } catch (IOException e){
             e.printStackTrace();
         }

         try {
            Process p = Runtime.getRuntime().exec("pdflatex -quiet tmp.tex");
            p.waitFor();
            //System.out.println(p.exitValue());
            Process pp = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler tmp.pdf");
            pp.waitFor();
         }
         catch (Exception err) {
            err.printStackTrace();
         }

     }//GEN-LAST:event_btPaste1ActionPerformed

     private void miSaveFileAs1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_miSaveFileAs1ActionPerformed
         btPaste1ActionPerformed(evt);
     }//GEN-LAST:event_miSaveFileAs1ActionPerformed
     
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btBold;
    private javax.swing.JButton btCopy;
    private javax.swing.JButton btCut;
    private javax.swing.JButton btHeight;
    private javax.swing.JButton btHorizontalCenter;
    private javax.swing.JButton btHorizontalLeft;
    private javax.swing.JButton btHorizontalRight;
    private javax.swing.JButton btItalic;
    private javax.swing.JButton btNewFile;
    private javax.swing.JButton btOpenFile;
    private javax.swing.JButton btPaste;
    private javax.swing.JButton btPaste1;
    private javax.swing.JButton btSaveFile;
    private javax.swing.JButton btSluc;
    private javax.swing.JButton btTypeWriter;
    private javax.swing.JButton btWidth;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JToolBar.Separator jSeparator1;
    private javax.swing.JPopupMenu.Separator jSeparator10;
    private javax.swing.JToolBar.Separator jSeparator2;
    private javax.swing.JToolBar.Separator jSeparator3;
    private javax.swing.JToolBar.Separator jSeparator4;
    private javax.swing.JPopupMenu.Separator jSeparator5;
    private javax.swing.JPopupMenu.Separator jSeparator6;
    private javax.swing.JToolBar.Separator jSeparator7;
    private javax.swing.JPopupMenu.Separator jSeparator8;
    private javax.swing.JPopupMenu.Separator jSeparator9;
    private javax.swing.JSpinner jSpinner1;
    private javax.swing.JSpinner jSpinner2;
    private javax.swing.JToolBar jToolBar1;
    private javax.swing.JMenu mEdit;
    private javax.swing.JMenu mFormat;
    private javax.swing.JPanel mainPanel;
    private javax.swing.JMenuBar menuBar;
    private javax.swing.JMenuItem miBold;
    private javax.swing.JMenuItem miCopy;
    private javax.swing.JMenuItem miCut;
    private javax.swing.JMenuItem miDel;
    private javax.swing.JMenuItem miHC;
    private javax.swing.JMenuItem miHL;
    private javax.swing.JMenuItem miHR;
    private javax.swing.JMenuItem miItalic;
    private javax.swing.JMenuItem miNew;
    private javax.swing.JMenuItem miOpenFile;
    private javax.swing.JMenuItem miPaste;
    private javax.swing.JMenuItem miSaveFile;
    private javax.swing.JMenuItem miSaveFileAs;
    private javax.swing.JMenuItem miSaveFileAs1;
    private javax.swing.JMenuItem miSluc;
    private javax.swing.JPopupMenu pmBorder;
    private javax.swing.JMenuItem pmiBottom;
    private javax.swing.JMenuItem pmiDBottom;
    private javax.swing.JMenuItem pmiDLeft;
    private javax.swing.JMenuItem pmiDRight;
    private javax.swing.JMenuItem pmiDTop;
    private javax.swing.JMenuItem pmiFrame;
    private javax.swing.JMenuItem pmiFull;
    private javax.swing.JMenuItem pmiLeft;
    private javax.swing.JMenuItem pmiNone;
    private javax.swing.JMenuItem pmiRight;
    private javax.swing.JMenuItem pmiTop;
    private javax.swing.JProgressBar progressBar;
    private javax.swing.JSpinner spBorder;
    private javax.swing.JLabel statusAnimationLabel;
    private javax.swing.JLabel statusMessageLabel;
    private javax.swing.JPanel statusPanel;
    // End of variables declaration//GEN-END:variables
     
     
     private javax.swing.JTable rowHeader;
     private table.MultiSpanCellTable jTable1;
     private final Timer messageTimer;
     private final Timer busyIconTimer;
     private final Icon idleIcon;
     private final Icon[] busyIcons = new Icon[15];
     private int busyIconIndex = 0;
     
     AttributiveCellTableModel model;
     DefaultTableModel rowHeaderModel;
     CellSpan cellAtt;
     
     JButton btBorder; //tlačítko rámečku
     JMenuItem pmiActualBorder; //aktuální položka
     
     private JDialog aboutBox;
     
     private SizeDialog sizeDialog;
     ListSelectionListener table_listener;
     
     int counter = 0;
     
}

